#include "commandline/Parser.h"

using namespace commandline;

Parser::~Parser()
{
	qDeleteAll(_options);
}

bool Parser::parse(const QStringList& arguments)
{
	if (!_parser.parse(arguments))
	{
		return false;
	}

	for (Option* option : _options)
	{
		QString value = this->value(*option);
		if (!option->validate(*this, value))
		{
			const QString error = option->getError();
			if (!error.isEmpty())
			{
				_errorText = tr("%1 is not a valid option for %2\n%3").arg(value, option->name(), error);
			}
			else
			{
				_errorText = tr("%1 is not a valid option for %2").arg(value, option->name());
			}
			return false;
		}
	}
	return true;
}

void Parser::process(const QStringList& arguments)
{
	_parser.process(arguments);
	if (!parse(arguments))
	{
		fprintf(stdout, "%s", qPrintable(tr("Error: %1").arg(_errorText)));
		showHelp(EXIT_FAILURE);
	}
}

void Parser::process(const QCoreApplication& /*app*/)
{
	process(QCoreApplication::arguments());
}

QString Parser::errorText() const
{
	return (!_errorText.isEmpty()) ? _errorText : _parser.errorText();
}

bool Parser::addOption(Option& option)
{
	return addOption(&option);
}

bool Parser::addOption(Option* const option)
{
	_options[option->name()] = option;
	return _parser.addOption(*option);
}

QStringList Parser::_getNames(const char shortOption, const QString& longOption)
{
	QStringList names;
	if (shortOption != 0x0)
	{
		names << QString(shortOption);
	}
	if (longOption.size() != 0)
	{
		names << longOption;
	}
	return names;
}

QString Parser::_getDescription(const QString& description, const QString& default_)
{
	/* Add the translations if available */
	QString formattedDescription(tr(qPrintable(description)));

	/* Fill in the default if needed */
	if (!default_.isEmpty())
	{
		if (!formattedDescription.contains("%1"))
		{
			formattedDescription += " [default: %1]";
		}
		formattedDescription = formattedDescription.arg(default_);
	}
	return formattedDescription;
}
